package com.ruoyi.interfaced.service.impl;

import com.ruoyi.interfaced.domain.WechatUser;
import io.jsonwebtoken.*;
import org.springframework.stereotype.Component;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

@Component
public class WeChatUserService {
    private String key =  "wechatToken";
    // 加密
    public String token(WechatUser user){
        // 指定签名的时候使用的签名算法，也就是header那部分，jjwt已经将这部分内容封装好了。
        SignatureAlgorithm signatureAlgorithm  = SignatureAlgorithm.HS256;
        // 生成JWT的时间
        long nowMillis = System.currentTimeMillis();
        Date now = new Date(nowMillis);
        //创建payload的私有声明（根据特定的业务需要添加，如果要拿这个做验证，一般是需要和jwt的接收方提前沟通好验证方式的）
        Map<String,Object> claims = new HashMap<String,Object>();
        claims.put("openid", user.getOpenid());
        System.out.println("getOpenid："+user.getOpenid());
        // new一个JwtBuilder，设置jwt的body
        JwtBuilder builder = Jwts.builder();
        //如果有私有声明，一定要先设置这个自己创建的私有的声明，这个是给builder的claim赋值，一旦写在标准的声明赋值之后，就是覆盖了那些标准的声明的
        builder.setClaims(claims);
        // iat: jwt的签发时间
        builder.setIssuedAt(now);
        // //设置签名使用的签名算法和签名使用的秘钥
        builder.signWith(signatureAlgorithm,key);
        // 设置过期时间
        Long expMillis = nowMillis + 60*60*1000;
        Date exp = new Date(expMillis);
        builder.setExpiration(exp);
        return builder.compact();
    }
    // 解密
    public Claims parseToken(String token){
        JwtParser claims  = Jwts.parser();
        claims.setSigningKey(key);
        Claims body = claims.parseClaimsJws(token).getBody();
        return body;
    }
}
